<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /* 
            滑动窗口-枚举右指针-循环外部更新答案
            时间复杂度：O(n)，并不是两个循环就是O(n)，这里的while循环条件sum - nums[left] >= target复杂度为O(1)
            空间复杂度：O(1)
        */
        var lengthOfLongestSubstring = function(s) {
            let ans = 0; // 结果 
            let start = 0; // 开始指针
            let end = 0; // 结束指针
            let map = {} // 利用map结构来判断之前是否存储了这个字符
            let arr = s.split('')
            let len = arr.length
            // 枚举结束指针，始终以结束指针为终点的子串
            while (end < len) {
                // 右字符纳入到map中
                const rVal = arr[end]
                // 右指针进入循环
                map[rVal] = map[rVal] || map[rVal] === 0 ? map[rVal] + 1 : 1
                // 出现重复字符
                while (map[rVal] > 1) {
                    // map里面去掉左侧字符
                    map[arr[start]] = map[arr[start]] - 1
                    // 左侧指针往前加
                    start++
                }
                // 更新最长子串的长度
                ans = Math.max(ans, end - start + 1)
                end++
            }
            return ans
        };
        console.log(lengthOfLongestSubstring('abcabcbb'));
        // console.log(minSubArrayLen(4, [1, 4, 4]));
        // console.log(minSubArrayLen(11, [1, 1, 1, 1, 1, 1, 1, 1]));
        // console.log(minSubArrayLen(213, [12,28,83,4,25,26,25,2,25,25,25,12]));
        
    </script>
</body>
</html>